package com.hyjx.framework.orm.dao;

import java.sql.Connection;
import java.util.List;
import java.util.Map;

/**
 * dao接口
 */
public interface IBaseDao {
    
    /**
     * 保存（insert）对象
     *
     * @param sqlid 在ibatis的xml文件中配置的sqlid,eg: "role.insert"
     * @param obj   一般为被保存的实体(model)对象
     * @return true:成功，false:失败
     */
    boolean addObject(String sqlid, Object obj);
    
    /**
     * 更新（update）对象
     *
     * @param sqlid 在ibatis的xml文件中配置的sqlid,eg: "role.update"
     * @param obj   一般为被更新的实体(model)对象
     * @return 影响的数据行数
     */
    int updateObject(String sqlid, Object obj);
    
    /**
     * 删除（delete）对象
     *
     * @param sqlid 在ibatis的xml文件中配置的sqlid,eg: "role.delete"
     * @param obj   一般为被删除的实体(model)对象
     * @return 影响的数据行数
     */
    int deleteObject(String sqlid, Object obj);
    
    /**
     * 查询（select）对象
     *
     * @param sqlid 在ibatis的xml文件中配置的sqlid,eg: "role.select"
     * @param obj   一般为被查询的实体(model)对象
     * @return 一般为被查询的实体(model)对象
     */
    Object queryObject(String sqlid, Object obj);
    
    /**
     * 查询（select）对象列表
     *
     * @param sqlid 在ibatis的xml文件中配置的sqlid,eg: "role.selectAll"
     * @param obj   一般为被查询的实体(model)对象
     * @return 一般为被查询的实体(model)对象列表，如List<XxxModel>
     */
    @SuppressWarnings("rawtypes")
    List queryObjectList(String sqlid, Object obj);
    
    /**
     * 通过sqlID进行分页查询操作返回json对象
     *
     * @param sqlID       在ibatis的xml文件中配置的sqlid,eg: "role.selectAll"
     * @param countSqlID  在ibatis的xml文件中配置的sqlid,eg: "role.selectAllCount"
     * @param paramObject 一般为被查询的实体(model)对象，用来做传参（条件）
     * @return json对象
     */
    String getPageJsonStr(final String sqlID, final String countSqlID, Object paramObject);
    
    /**
     * 获取查询json格式数据，针对手动分页情况。
     *
     * @param sqlID       sql语句id
     * @param countSqlID  查询数量语句id
     * @param paramObject 参数对象
     * @param pageNo      页码
     * @param pageSize    页数
     * @return 返回json格式数据
     */
    String getPageJsonStr(final String sqlID, final String countSqlID, Object paramObject, int pageNo, int pageSize);
    
    @SuppressWarnings("rawtypes")
    
    /**
     * 查询（select）对象列表--无参
     * @param sqlid 在ibatis的xml文件中配置的sqlid,eg: "role.selectAll"
     * @return 一般为被查询的实体(model)对象列表，如List<XxxModel>
     */
    List queryObjectList(String sqlid);
    
    String getCurrSql(Object params, String sqlName);
    
    /**
     * 获取查询json格式数据，针对手动分页情况。
     *
     * @param sqlID       在ibatis的xml文件中配置的sqlid,eg: "role.selectAll"
     * @param countSqlID  在ibatis的xml文件中配置的查结果行数的sqlid,eg: "role.selectAllCount"
     * @param paramObject 参数对象
     * @return 返回Pager封装对象
     */
    Pager getPager(final String sqlID, final String countSqlID, final Object paramObject);
    
    /**
     * 获取查询json格式数据，针对手动分页情况。
     *
     * @param sqlID       在ibatis的xml文件中配置的sqlid,eg: "role.selectAll"
     * @param countSqlID  在ibatis的xml文件中配置的查结果行数的sqlid,eg: "role.selectAllCount"
     * @param paramObject 参数对象
     * @return 返回Pager封装对象
     */
    Pager getPager(final String sqlID, final String countSqlID, final Object paramObject, final int iPageNo, final int iPageSize);
    
    /**
     * 取当前连接信息
     *
     * @return
     */
    Connection getCurrentConnection();
    
    /**
     * 根据sql取列表
     *
     * @param sql 实体SQL语句
     * @return
     */
    List<Map<String, Object>> queryListBySql(String sql);
    
    /**
     * 执行一条SQL
     *
     * @param sql 实体sql语句
     * @return
     */
    boolean executeSql(String sql);
    
    /**
     * 批量插入数据
     *
     * @param sqlid
     * @param list
     * @return
     */
    int batchInsertObject(String sqlid, List<?> list);
    
    /**
     * 批量更新数据
     *
     * @param sqlid
     * @param list
     * @return
     */
    int batchUpdateObject(String sqlid, List<?> list);
    
    /**
     * 查询数据
     *
     * @param sqlID       在ibatis的xml文件中配置的sqlid,eg: "role.selectAll"
     * @param countSqlID  在ibatis的xml文件中配置的查结果行数的sqlid,eg: "role.selectAllCount"
     * @param paramObject 参数对象
     * @return 返回Pager封装对象
     */
    Pager getPageList(final String sqlID, final String countSqlID, Object paramObject);
    
}